Android Jetpack 与 Kotlin 教程
1. Kotlin 简介和特性
Kotlin 是一种现代的静态类型编程语言,由 JetBrains 开发,旨在与 Java 完全互操作。Kotlin 简洁、安全且功能强大,特别适合 Android 开发。
1.1 Kotlin 的主要特性
- 简洁性:Kotlin 减少了样板代码,使代码更易读和维护。
- 安全性:通过可空类型和非空类型,Kotlin 减少了空指针异常的风险。
- 互操作性:Kotlin 与 Java 完全兼容,可以无缝调用 Java 代码。
- 函数式编程:Kotlin 支持高阶函数、Lambda 表达式和函数组合。
2. 开发环境搭建
2.1 安装 IntelliJ IDEA
IntelliJ IDEA 是 JetBrains 开发的集成开发环境,支持 Kotlin 和 Android 开发。
- 访问 IntelliJ IDEA 官网 下载并安装。
- 安装完成后,启动 IntelliJ IDEA。
2.2 安装 Android Studio
Android Studio 是官方的 Android 开发 IDE,基于 IntelliJ IDEA 构建。
- 访问 Android Studio 官网 下载并安装。
- 安装完成后,启动 Android Studio。
3. 第一个 Kotlin 程序
在 IntelliJ IDEA 或 Android Studio 中创建一个新的 Kotlin 项目。
fun main() {
println("Hello, Kotlin!")
}
3.1 运行程序
- 右键点击代码编辑器,选择
Run 'MainKt'。 - 控制台将输出
Hello, Kotlin!。
4. 基本语法和数据类型
4.1 变量和常量
- 变量:使用
var声明,可以重新赋值。 - 常量:使用
val声明,不可重新赋值。
var age: Int = 30
val name: String = "Kotlin"
4.2 数据类型
Kotlin 支持多种基本数据类型:
Int:整数类型Double:双精度浮点数String:字符串Boolean:布尔类型
val number: Int = 10
val pi: Double = 3.14
val message: String = "Hello"
val isKotlinAwesome: Boolean = true
5. 条件语句
5.1 if 语句
val a = 10
val b = 20
if (a > b) {
println("a is greater than b")
} else {
println("b is greater than a")
}
5.2 when 语句
when 类似于 Java 中的 switch 语句,但更强大。
val day = 3
when (day) {
1 -> println("Monday")
2 -> println("Tuesday")
3 -> println("Wednesday")
else -> println("Other day")
}
6. 循环
6.1 for 循环
for (i in 1..5) {
println(i)
}
6.2 while 循环
var i = 0
while (i < 5) {
println(i)
i++
}
6.3 do-while 循环
var i = 0
do {
println(i)
i++
} while (i < 5)
7. 跳转表达式
7.1 break
for (i in 1..10) {
if (i == 5) {
break
}
println(i)
}
7.2 continue
for (i in 1..10) {
if (i == 5) {
continue
}
println(i)
}
7.3 return
fun findNumber(numbers: List<Int>, target: Int): Boolean {
for (number in numbers) {
if (number == target) {
return true
}
}
return false
}
8. 函数定义和调用
8.1 函数定义
fun add(a: Int, b: Int): Int {
return a + b
}
8.2 函数调用
val result = add(3, 5)
println(result) // 输出 8
9. 默认参数和命名参数
9.1 默认参数
fun greet(name: String = "World") {
println("Hello, $name!")
}
greet() // 输出 Hello, World!
greet("Kotlin") // 输出 Hello, Kotlin!
9.2 命名参数
fun greet(name: String = "World", age: Int = 30) {
println("Hello, $name! You are $age years old.")
}
greet(age = 25, name = "Kotlin") // 输出 Hello, Kotlin! You are 25 years old.
10. 单表达式函数
fun square(x: Int) = x * x
val result = square(5)
println(result) // 输出 25
11. Lambda 表达式
val sum = { a: Int, b: Int -> a + b }
val result = sum(3, 5)
println(result) // 输出 8
12. 高阶函数
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val result = operateOnNumbers(3, 5) { x, y -> x * y }
println(result) // 输出 15
13. 类定义和实例化
13.1 类定义
class Person(val name: String, var age: Int) {
fun greet() {
println("Hello, my name is $name and I am $age years old.")
}
}
13.2 实例化
val person = Person("Kotlin", 30)
person.greet() // 输出 Hello, my name is Kotlin and I am 30 years old.
14. 构造函数和初始化块
14.1 主构造函数
class Person(val name: String, var age: Int)
14.2 初始化块
class Person(val name: String, var age: Int) {
init {
println("Person object created with name $name and age $age")
}
}
15. 属性和字段
class Person(val name: String, var age: Int) {
var address: String = ""
get() = field
set(value) {
field = value
}
}
16. 继承和接口
16.1 继承
open class Animal(val name: String) {
open fun makeSound() {
println("$name makes a sound")
}
}
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("$name barks")
}
}
16.2 接口
interface Flyable {
fun fly()
}
class Bird(name: String) : Animal(name), Flyable {
override fun fly() {
println("$name flies")
}
}
17. 数据类和密封类
17.1 数据类
data class User(val id: Int, val name: String)
val user = User(1, "Kotlin")
println(user) // 输出 User(id=1, name=Kotlin)
17.2 密封类
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
fun processResult(result: Result) {
when (result) {
is Success -> println("Success: ${result.data}")
is Error -> println("Error: ${result.message}")
}
}
18. 对象声明和表达式
18.1 对象声明
object Singleton {
val name = "Singleton"
fun greet() {
println("Hello from $name")
}
}
Singleton.greet() // 输出 Hello from Singleton
18.2 对象表达式
val obj = object {
val name = "Anonymous"
fun greet() {
println("Hello from $name")
}
}
obj.greet() // 输出 Hello from Anonymous
19. 可空类型和非空类型
19.1 可空类型
var name: String? = null
name = "Kotlin"
println(name) // 输出 Kotlin
19.2 非空类型
var name: String = "Kotlin"
// name = null // 编译错误
println(name) // 输出 Kotlin
20. 安全调用操作符 (?.)
var name: String? = null
println(name?.length) // 输出 null
name = "Kotlin"
println(name?.length) // 输出 6
21. Elvis 操作符 (?:)
var name: String? = null
val length = name?.length ?: 0
println(length) // 输出 0
name = "Kotlin"
val length2 = name?.length ?: 0
println(length2) // 输出 6
22. 非空断言 (!!)
var name: String? = null
// val length = name!!.length // 运行时错误:NullPointerException
name = "Kotlin"
val length = name!!.length
println(length) // 输出 6
23. 平台类型
val javaString: String? = null // Java 代码返回的 String 可能是 null
val kotlinString: String = javaString ?: "default"
println(kotlinString) // 输出 default
24. List, Set, Map
24.1 List
val list = listOf("Kotlin", "Java", "Python")
println(list) // 输出 [Kotlin, Java, Python]
24.2 Set
val set = setOf("Kotlin", "Java", "Python", "Kotlin")
println(set) // 输出 [Kotlin, Java, Python]
24.3 Map
val map = mapOf("Kotlin" to 1, "Java" to 2, "Python" to 3)
println(map) // 输出 {Kotlin=1, Java=2, Python=3}
25. 可变集合和不可变集合
25.1 可变集合
val mutableList = mutableListOf("Kotlin", "Java")
mutableList.add("Python")
println(mutableList) // 输出 [Kotlin, Java, Python]
25.2 不可变集合
val immutableList = listOf("Kotlin", "Java")
// immutableList.add("Python") // 编译错误
println(immutableList) // 输出 [Kotlin, Java]
26. 集合操作 (filter, map, reduce 等)
26.1 filter
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // 输出 [2, 4]
26.2 map
val numbers = listOf(1, 2, 3, 4, 5)
val squaredNumbers = numbers.map { it * it }
println(squaredNumbers) // 输出 [1, 4, 9, 16, 25]
26.3 reduce
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, i -> acc + i }
println(sum) // 输出 15
27. 序列 (Sequence)
val sequence = sequenceOf(1, 2, 3, 4, 5)
val evenNumbers = sequence.filter { it % 2 == 0 }
println(evenNumbers.toList()) // 输出 [2, 4]
28. 不可变性
val immutableList = listOf("Kotlin", "Java")
// immutableList.add("Python") // 编译错误
println(immutableList) // 输出 [Kotlin, Java]
29. 纯函数
fun add(a: Int, b: Int): Int {
return a + b
}
val result = add(3, 5)
println(result) // 输出 8
30. 函数组合
fun compose(f: (Int) -> Int, g: (Int) -> Int): (Int) -> Int {
return { x -> f(g(x)) }
}
val addOne = { x: Int -> x + 1 }
val square = { x: Int -> x * x }
val addOneThenSquare = compose(square, addOne)
println(addOneThenSquare(2)) // 输出 9
31. 柯里化
fun add(a: Int) = { b: Int -> a + b }
val addTwo = add(2)
println(addTwo(3)) // 输出 5
32. 协程基础
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
}
33. 挂起函数
import kotlinx.coroutines.*
suspend fun fetchData(): String {
delay(1000L)
return "Data"
}
fun main() = runBlocking {
val data = fetchData()
println(data) // 输出 Data
}
34. 协程上下文和调度器
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Default) {
println("Running on ${Thread.currentThread().name}")
}
println("Main thread")
}
35. 通道和流
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
channel.close()
}
for (y in channel) println(y)
}
36. 异步编程模式
import kotlinx.coroutines.*
fun main()